[アップデート]Step FunctionsでDynamoDB + Glue を試してみた #reinvent
はじめに
こんにちは、福岡オフィス所属、IT推進室の井手です。
re:Invent 2018にて、Step Functionsの連携サービスが大幅に追加されました。
[神アップデート]Step Functionsが新たに8つのマネージドサービスと連携可能になりました! #reinvent
今回は、新規に追加されたDynamoDBとGuleの連携を試してみたいと思います。
構成
今回やりたい事は以下です。GlueのJob呼び出しだけでは面白くない(というより性質上前後がある)ので、DynamoDBも合わせて試してみました。実際の活用としては、何かしらのListなどをDynamoDBに突っ込んで、それをGlueでETL処理、というイメージです。
やってみた
前提
※クローラ、Job、Step Functions設定時に利用するIAMロールについては都度使用するリソースに対するポリシーをアタッチしています。
※作成方法は本題ではない&各name入力程度なので省略しています。
(データソース)DynamoDBのテーブル作成
作成方法については省略しますが、以下のように作成しました。
(データターゲット)S3 Bucketの作成
こちらも作成方法については省略しますが、以下のように作成しました。
GlueでJobの作成
次に、先程作成したデータソースとデータターゲットをつなぐJobを作成します。が、その前にJobにはデータカタログが必要なのでそちらから作成していきます。全体の手順はざっくりと以下です。
1. データベースの作成
またまた作成方法については省略しますが、以下のように作成しました。
2. テーブルの作成(クローラ使用)
次に、クローラを使用してテーブルを作成します。
画面のフロー通りに進んで行き以下のような設定で作成しました。
オンデマンド実行し、クローラが無事終了すればデータカタログは完了です。
3. Jobの作成
ジョブの追加より作成します。
画面のフロー通りに進んで行き以下のような設定で作成しました。
※マッピングはid列だけでマッピングしています。
Step Functionsの作成
やっと本題のStep Functionsの作成の作成まできました。
ステートマシンの定義は以下
{ "StartAt": "PutItem", "States": { "PutItem": { "Type": "Task", "Resource": "arn:aws:states:::dynamodb:putItem", "Parameters": { "TableName": "test_glue_db", "Item": { "id": {"S": "1"} } }, "ResultPath": "$.DynamoDB", "Next": "Glue StartJobRun" }, "Glue StartJobRun": { "Type": "Task", "Resource": "arn:aws:states:::glue:startJobRun.sync", "Parameters": { "JobName": "test_job" }, "End": true } } }
Step Functionsの実行
コンソールより実行してみます。
無事成功しました。
結果の確認
最後に、GlueによってS3 Bucketに出力されているか確認します。オブジェクトとダウンロード結果が以下です。
ちゃんとjsonで作成されていますね!
さいごに
ETLというと色々方法が考えられると思いますが、re:invent内で参加したSessionでの事例にGlueが使用されている例をいくつか見ました。Step FunctionsでJobを呼び出せるようになった事で更に使用例が増えるのではと感じました。